package com.mryang.hds.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.mryang.hds.entity.User;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Genius
 * @version 1.0.0
 * @ClassName JWTUtil.java
 * @Description TODO JWT工具类
 * @createTime 2022年12月25日 19:34:00
 */
public class JWTUtil {

    /**
     * 根据用户id,账号生成token
     * @param u
     * @return
     */
    public static String getToken(User u) {

//        System.out.println(u);
        String token = "";
        try {
            //过期时间 为1970.1.1 0:0:0 至 过期时间  当前的毫秒值 + 有效时间
            // Date expireDate = new Date(new Date().getTime() + 10*1000);
            Date expireDate = new Date(new Date().getTime() + 43200*1000);
            //秘钥及加密算法                            秘钥自定义
            Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
            //设置头部信息
            Map<String,Object> header = new HashMap<>();
            header.put("typ","JWT");
            header.put("alg","HS256");
            //携带id，账号信息，生成签名
            token = JWT.create()
                    .withHeader(header)   //第一部分
                    .withClaim("uid",u.getUserId())  //第二部分  想把哪些数据放进token里就加哪个
                    .withClaim("ustatus",u.getStatus())
                    .withExpiresAt(expireDate)
                    .sign(algorithm);     //第三部分
        }catch (Exception e){
            e.printStackTrace();
            return  null;
        }

        // System.out.println(getTokenInfoIndex(token));
        return token;
    }


    /**
     * 验证token是否有效
     * @param token
     * @return
     */
    public static boolean verify(String token){
        try {
            //验签
            Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获得token 中playload部分数据,按需使用
     * @param token
     * @return
     */
    public static DecodedJWT getTokenInfo(String token){

        return JWT.require(Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE")).build().verify(token);
    }

    /**
     * 解析出token中封装的用户编号
     */
    public static Integer getTokenInfoIndex(String token){

        DecodedJWT tokenInfo = JWT.require(Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE")).build().verify(token);

        Integer index = tokenInfo.getClaim("uid").asInt();

        return index;
    }

    /**
     * 解析出token中封装的用户标识
     */
    public static Integer getTokenFlag(String token){
        DecodedJWT tokenInfo = JWT.require(Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE")).build().verify(token);

        Integer flag = tokenInfo.getClaim("ustatus").asInt();

        return flag;
    }


    // 将token中的 用户编号、身份信息 放入map集合中
    public static User getTokenMap(String token){

        Map<String,Integer> map = new HashMap<>();

        DecodedJWT tokenInfo = JWT.require(Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE")).build().verify(token);

        User tokenuser = new User();
        tokenuser.setUserId(tokenInfo.getClaim("uid").asInt());
        tokenuser.setStatus(tokenInfo.getClaim("ustatus").asInt());
        // map.put("userId",) ;
        // map.put("status",) ;

        return tokenuser;
    }
}
